package cn.lingyangwl.agile.system;

import cn.lingyangwl.agile.model.enums.*;
import cn.lingyangwl.agile.model.module.auth.*;
import cn.lingyangwl.agile.model.module.config.*;
import cn.lingyangwl.agile.system.model.entity.*;
import cn.lingyangwl.agile.system.model.rqrs.accesskey.*;
import cn.lingyangwl.agile.system.model.rqrs.config.*;
import cn.lingyangwl.agile.system.model.rqrs.log.*;
import cn.lingyangwl.agile.system.model.rqrs.tenant.*;
import cn.lingyangwl.agile.system.model.rqrs.user.*;

import java.util.List;
import java.util.Map;

/**
 * @author shenguangyang
 */
public interface SystemApi {
    /**
     * 获取密钥
     */
    AccessKeyResp getAccessKeyBySecretId(String secretId);

    AccessKeyResp getAccessKeyById(Long id);


    /**
     * 通过用户名查询用户信息
     *
     * @return 结果
     */
    LoginUser getLoginUser(LoginUserGetReq req);

    /**
     * 创建用户
     */
    Long saveUser(UserSaveReq req);

    List<UserResp> listUser(UserPageReq query);

    List<UserResp> listUserByIds(List<Long> userIds);

    void removeUserById(Long userId);

    UserResp getUserById(Long userId);

    void deleteLoginUser(LoginUserDeleteReq req);

    /**
     * 创建租户
     */
    String saveTenant(TenantSaveReq req);

    /**
     * 删除租户
     */
    void deleteTenant(String tenantId);

    /**
     * 更新租户
     */
    void updateTenant(TenantUpdateReq req);

    /**
     * 初始化登录用户租户信息
     */
    void initTenant();

    /**
     * 通过租户id获取管理其场景的租户id
     */
    String getMgtSceneTenantId(String tenantId);

    /**
     * 获取主租户id
     */
    String getMainTenantId(String tenantId);

    /**
     * 获取配置
     */
    ConfigResp getConfig(ConfigKeyEnum configKey);

    /**
     * 获取使用的配置
     * @param configDefine 配置定义
     */
    ConfigInfo getUseConfig(ConfigDefineEnum configDefine);


    Map<String, List<String>> listAssignRoleUrl(List<Long> roleIds);

    /**
     * 通过账号获取用户
     * @param account 用户名/邮箱/手机号
     * @return 系统用户
     */
    SysUser getUserByAccount(String account);

    /**
     * 查询区域
     */
    List<SysArea> listAreaByNames(List<String> areaTypes, List<String> areaNames);

    List<TenantResp> listTenantByIds(List<String> tenantIds);
    List<SysTenant> pageTenant(Integer pageNum, Integer pageSize);

    int deleteAccessLog(String endTime);
}
